﻿using Credinka.Ayni.GEN.UTL;
using Credinka.Ayni.SEA.EN;
using Credinka.Ayni.SEA.RN;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class AsignarMenuPerfil : System.Web.UI.Page
{
    private rnMenu ornMenu;
    private List<enMenu> loenMenu;

    private enPerfil oenPerfil;
    private rnPerfil ornPerfil;
    private List<enPerfil> loenPerfil;

    private enPerfilMenu oenPerfilMenu;
    private rnPerfilMenu ornPerfilMenu;
    private List<enMenu> loenMenuPerfilNuevo;

    private rnDescripcion ornDescripcion;

    private enFormularioObjeto oenFormularioObjeto;
    private rnFormularioObjeto ornFormularioObjeto;
    private List<enFormularioObjeto> loenFormularioObjeto;

    private enDetalleFormularioObjetoPerfil oenFormularioObjetoPerfil;
    private rnDetalleFormularioObjetoPerfil ornFormularioObjetoPerfil;
    private List<enDetalleFormularioObjetoPerfil> loenFormularioObjetoPerfil;

    List<enPerfilMenu> lstPermisosAdd = new List<enPerfilMenu>();
    List<enPerfilMenu> lstPermisosDel = new List<enPerfilMenu>();
    List<enDetalleFormularioObjetoPerfil> lstPermisosAddObj = new List<enDetalleFormularioObjetoPerfil>();
    List<enDetalleFormularioObjetoPerfil> lstPermisosDelObj = new List<enDetalleFormularioObjetoPerfil>();

    #region Métodos

    private void ListarPerfil()
    {
        oenPerfil = new enPerfil();
        ornPerfil = new rnPerfil();
        loenPerfil = ornPerfil.ListarPerfil();
        ddlPerfil.DataSource = loenPerfil.ToList();
        ddlPerfil.DataTextField = "Nombre";
        ddlPerfil.DataValueField = "IdPerfil";
        ddlPerfil.DataBind();
    }

    private void ListarSistema()
    {
        ornDescripcion = new rnDescripcion();
        ddlSistema.DataSource = ornDescripcion.ListarSistema();
        ddlSistema.DataTextField = "Descripcion";
        ddlSistema.DataValueField = "CodigoElemento";
        ddlSistema.DataBind();
        ddlSistema.Items.Insert(0, new ListItem("TODOS", "0"));
    }

    /// Metodo que lista a los sistemas en el treeview
    private void ListarSistemaEnArbol(TreeNodeCollection nodoSistema, int padre, int pCodigoSistema)
    {
        loenMenu = new List<enMenu>();
        ornMenu = new rnMenu();

        loenMenu = ornMenu.ListarPorSistema(pCodigoSistema).Where(t => t.Contenedor == padre).ToList();

        List<string> sistema = (from cust in loenMenu select cust.entDescripcion.Descripcion).Distinct().ToList();
        List<int> sistemaCodigo = (from cust in loenMenu select cust.CodigoSistema).Distinct().ToList();

        for (int i = 0; i < sistema.Count(); i++)
        {
            TreeNode NuevoNodoSistema = new TreeNode(sistema[i], sistemaCodigo[i].ToString());
            NuevoNodoSistema.ShowCheckBox = false;
            nodoSistema.Add(NuevoNodoSistema);
            ListarMenu(NuevoNodoSistema.ChildNodes, 0, sistemaCodigo[i]);
        }
    }

    /// Método que lista los menus que tiene contenido el sistema.
    protected void ListarMenu(TreeNodeCollection nodo, int padre, int pIdSistema)
    {
        ornMenu = new rnMenu();
        oenFormularioObjeto = new enFormularioObjeto();
        ornFormularioObjeto = new rnFormularioObjeto();
        loenFormularioObjeto = new List<enFormularioObjeto>();

        int Codigo;
        string Nombre;
        int CodigoFormulario;
        int CodigoObjeto;
        string NombreObjeto;

        TreeNode NuevoNodo = new TreeNode();
        loenMenu = new List<enMenu>();
        loenMenu = ornMenu.ListarPorSistema(pIdSistema).ToList().Where(t => t.Contenedor == padre).ToList();

        foreach (var hijos in loenMenu)
        {
            Codigo = hijos.IdMenu;
            Nombre = hijos.Nombre;
            CodigoFormulario = hijos.IdFormulario;

            //Buscando los objeto que tiene asociado el formulario.
            oenFormularioObjeto.IdFormulario = CodigoFormulario;
            loenFormularioObjeto = ornFormularioObjeto.ListarObjeto(oenFormularioObjeto);

            TreeNode NuevoNodoPadre = new TreeNode(Nombre, Codigo.ToString());
            nodo.Add(NuevoNodoPadre);

            if (loenFormularioObjeto.Count > 0)
            {
                foreach (var item in loenFormularioObjeto)
                {
                    CodigoObjeto = item.IdFormularioObjeto;
                    NombreObjeto = item.entDescripcion.DescripcionCorta;
                    NuevoNodo = new TreeNode(NombreObjeto, CodigoObjeto.ToString(), "~/images/25.png", "", "objeto");
                    nodo.Add(NuevoNodo);
                    NuevoNodoPadre.ChildNodes.Add(NuevoNodo);   
                }
            }
            ListarMenu(NuevoNodoPadre.ChildNodes, Codigo, pIdSistema);
        }
    }

    /// Obtener los menus chequeados.
    private void ObtenerPadres()
    {
        foreach (TreeNode itemNode in trvMenu.Nodes)
        {
            foreach (enMenu item in loenMenuPerfilNuevo)
            {
                if (int.Parse(itemNode.Value) == item.IdMenu)
                    itemNode.Checked = true;

                for (int i = 0; i < itemNode.ChildNodes.Count; i++)
                {
                    if (itemNode.ChildNodes[i].Target == string.Empty)
                        ObtenerHijos(itemNode.ChildNodes, item.IdMenu);
                }
            }
        }
    }

    /// Obtiene los hijos chequeados.
    private void ObtenerHijos(TreeNodeCollection nodes, int id)
    {
        foreach (TreeNode item in nodes)
        {
            if (item.Target == string.Empty)
            {
                if (int.Parse(item.Value) == id)
                    item.Checked = true;
            }
            else
            {
                foreach (var itemDetalle in loenFormularioObjetoPerfil)
                {
                    if (itemDetalle.IdFormularioObjeto == int.Parse(item.Value))
                        item.Checked = true;
                }
            }
            if (item.ChildNodes.Count > 0)
                ObtenerHijos(item.ChildNodes, id);
        }
    }

    // Llena una lista temporal de menus padres a registrar.
    private void RecorrerTreeViewPadres(TreeNodeCollection treeViews)
    {
        loenMenuPerfilNuevo = (List<enMenu>)Session["MenuBD"];

        foreach (TreeNode itemNode in treeViews)
        {
            if (itemNode.Checked)
            {
                var newList = loenMenuPerfilNuevo.FindAll(s => s.IdMenu == int.Parse(itemNode.Value));
                if (newList.Count == 0)
                {
                    enPerfilMenu entPerfilMenu = new enPerfilMenu();
                    entPerfilMenu.IdMenu = int.Parse(itemNode.Value);
                    entPerfilMenu.IdPerfil = int.Parse(ddlPerfil.SelectedValue);
                    lstPermisosAdd.Add(entPerfilMenu);
                }
            }
            else
            {
                if (itemNode.ShowCheckBox == true)
                {
                    var newList = loenMenuPerfilNuevo.FindAll(s => s.IdMenu == int.Parse(itemNode.Value));
                    if (newList.Count == 0)
                    {
                        enPerfilMenu entPerfilMenu = new enPerfilMenu();
                        lstPermisosDel.Add(entPerfilMenu);
                    }
                }
            }
            RecorrerTreeviewHijos(itemNode.ChildNodes, int.Parse(itemNode.Value));
        }

        this.AgregarPermisos(lstPermisosAdd, lstPermisosAddObj);
        this.QuitarPermisos(lstPermisosDel, lstPermisosDelObj);
        this.LimpiarPadre();
    }

    // Llena una lista temporal de menus hijos a registrar.
    private void RecorrerTreeviewHijos(TreeNodeCollection nodes, int id)
    {
        loenMenuPerfilNuevo = (List<enMenu>)Session["MenuBD"];
        loenFormularioObjetoPerfil = (List<enDetalleFormularioObjetoPerfil>)Session["ObjetosBD"];

        foreach (TreeNode item in nodes)
        {
            oenPerfilMenu = new enPerfilMenu();
            oenFormularioObjetoPerfil = new enDetalleFormularioObjetoPerfil();

            if (item.Checked)
            {
                if (item.Target == string.Empty)
                {
                    var newList = loenMenuPerfilNuevo.FindAll(s => s.IdMenu == int.Parse(item.Value));
                    if (newList.Count == 0)
                    {
                        oenPerfilMenu.IdPerfil = int.Parse(ddlPerfil.SelectedValue);
                        oenPerfilMenu.IdMenu = int.Parse(item.Value);
                        lstPermisosAdd.Add(oenPerfilMenu);
                    }
                }
                else
                {
                    var newList = loenFormularioObjetoPerfil.FindAll(s => s.IdFormularioObjeto == int.Parse(item.Value));
                    if (newList.Count == 0)
                    {
                        oenFormularioObjetoPerfil.IdPerfil = int.Parse(ddlPerfil.SelectedValue);
                        oenFormularioObjetoPerfil.IdFormularioObjeto = int.Parse(item.Value);
                        lstPermisosAddObj.Add(oenFormularioObjetoPerfil);
                    }
                }
            }
            else
            {
                if (item.Target == string.Empty)
                {
                    var newList = loenMenuPerfilNuevo.FindAll(s => s.IdMenu == int.Parse(item.Value));
                    foreach (var itemNew in newList)
                    {
                        oenPerfilMenu.IdPerfilMenu = itemNew.pIdMenuPerfil;
                        lstPermisosDel.Add(oenPerfilMenu);
                    }
                }
                else
                {
                    var newList = loenFormularioObjetoPerfil.FindAll(s => s.IdFormularioObjeto == int.Parse(item.Value));
                    foreach (var itemNew in newList)
                    {
                        oenFormularioObjetoPerfil.IdDetalleFormularioObjetoPerfil = itemNew.IdDetalleFormularioObjetoPerfil;
                        lstPermisosDelObj.Add(oenFormularioObjetoPerfil);
                    }
                }

            }
            if (item.ChildNodes.Count > 0)
                RecorrerTreeviewHijos(item.ChildNodes, id);
        }
    }

    /// Registra menus y elimina de forma lógica.
    private void AgregarPermisos(List<enPerfilMenu> lstPermisosAdd, List<enDetalleFormularioObjetoPerfil> lstPermisosAddObj)
    {
        ornPerfilMenu = new rnPerfilMenu();
        oenPerfilMenu = new enPerfilMenu();

        ornFormularioObjetoPerfil = new rnDetalleFormularioObjetoPerfil();
        oenFormularioObjetoPerfil = new enDetalleFormularioObjetoPerfil();

        for (int i = 0; i < lstPermisosAdd.Count; i++)
        {
            oenPerfilMenu.IdMenu = lstPermisosAdd[i].IdMenu;
            oenPerfilMenu.IdPerfil = lstPermisosAdd[i].IdPerfil;
            oenPerfilMenu.AudNombreUsuarioCreacion = utlAuditoria.ObtenerUsuarioDominio();
            oenPerfilMenu.AudIPCreacion = utlAuditoria.ObtenerDireccionIP();
            oenPerfilMenu.AudMacCreacion = utlAuditoria.ObtenerDireccionMAC();
            oenPerfilMenu.CodigoEstado = 1;
            ornPerfilMenu.Registrar(oenPerfilMenu);
        }

        for (int i = 0; i < lstPermisosAddObj.Count; i++)
        {
            oenFormularioObjetoPerfil.IdFormularioObjeto = lstPermisosAddObj[i].IdFormularioObjeto;
            oenFormularioObjetoPerfil.IdPerfil = lstPermisosAddObj[i].IdPerfil;
            oenFormularioObjetoPerfil.AudNombreUsuarioCreacion = utlAuditoria.ObtenerUsuarioDominio();
            oenFormularioObjetoPerfil.AudIPCreacion = utlAuditoria.ObtenerDireccionIP();
            oenFormularioObjetoPerfil.AudMacCreacion = utlAuditoria.ObtenerDireccionMAC();
            oenFormularioObjetoPerfil.CodigoEstado = 1;
            ornFormularioObjetoPerfil.Registrar(oenFormularioObjetoPerfil);
        }
    }

    private void QuitarPermisos(List<enPerfilMenu> lstPermisosDel, List<enDetalleFormularioObjetoPerfil> lstPermisosDelObj)
    {
        ornPerfilMenu = new rnPerfilMenu();
        oenPerfilMenu = new enPerfilMenu();

        ornFormularioObjetoPerfil = new rnDetalleFormularioObjetoPerfil();
        oenFormularioObjetoPerfil = new enDetalleFormularioObjetoPerfil();

        for (int i = 0; i < lstPermisosDel.Count; i++)
        {
            oenPerfilMenu.IdPerfilMenu = lstPermisosDel[i].IdPerfilMenu;
            oenPerfilMenu.AudNombreUsuarioModificacion = utlAuditoria.ObtenerUsuarioDominio();
            oenPerfilMenu.AudIPModificacion = utlAuditoria.ObtenerDireccionIP();
            oenPerfilMenu.AudMacModificacion = utlAuditoria.ObtenerDireccionMAC();
            ornPerfilMenu.Eliminar(oenPerfilMenu);
        }

        for (int i = 0; i < lstPermisosDelObj.Count; i++)
        {
            oenFormularioObjetoPerfil.IdDetalleFormularioObjetoPerfil = lstPermisosDelObj[i].IdDetalleFormularioObjetoPerfil;
            oenFormularioObjetoPerfil.AudNombreUsuarioModificacion = utlAuditoria.ObtenerUsuarioDominio();
            oenFormularioObjetoPerfil.AudIPModificacion = utlAuditoria.ObtenerDireccionIP();
            oenFormularioObjetoPerfil.AudMacModificacion = utlAuditoria.ObtenerDireccionMAC();
            ornFormularioObjetoPerfil.Eliminar(oenFormularioObjetoPerfil);
        }
    }

    // Limpia los objetos padres chequeados.
    private void LimpiarPadre()
    {
        foreach (TreeNode nodo in this.trvMenu.Nodes)
        {
            nodo.Checked = false;
            if (nodo.ChildNodes.Count > 0)
                LimpiarHijo(nodo.ChildNodes);
        }
    }

    // Limpia los objetos hijos chequeados.
    private void LimpiarHijo(TreeNodeCollection nodes)
    {
        foreach (TreeNode item in nodes)
        {
            item.Checked = false;
            if (item.ChildNodes.Count > 0)
                LimpiarHijo(item.ChildNodes);
        }
    }

    #endregion

    #region Eventos

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ListarPerfil();
            ListarSistema();

            loenMenuPerfilNuevo = new List<enMenu>();
            loenFormularioObjetoPerfil = new List<enDetalleFormularioObjetoPerfil>();

            ornMenu = new rnMenu();
            ornFormularioObjetoPerfil = new rnDetalleFormularioObjetoPerfil();

            ListarSistemaEnArbol(trvMenu.Nodes, 0, int.Parse(ddlSistema.SelectedValue));

            loenMenuPerfilNuevo = ornMenu.ListarPorPerfil(int.Parse(ddlPerfil.SelectedValue));
            Session["MenuBD"] = loenMenuPerfilNuevo;

            loenFormularioObjetoPerfil = ornFormularioObjetoPerfil.Listar(int.Parse(ddlPerfil.SelectedValue));
            Session["ObjetosBD"] = loenFormularioObjetoPerfil;

            if (loenMenuPerfilNuevo.Count != 0)
                ObtenerPadres();
        }
    }

    protected void btnBuscar_Click(object sender, EventArgs e)
    {
        ornFormularioObjetoPerfil = new rnDetalleFormularioObjetoPerfil();

        LimpiarPadre();
        trvMenu.Nodes.Clear();
        ListarSistemaEnArbol(trvMenu.Nodes, 0, int.Parse(ddlSistema.SelectedValue));

        loenMenuPerfilNuevo = ornMenu.ListarPorPerfil(int.Parse(ddlPerfil.SelectedValue));
        Session["MenuBD"] = loenMenuPerfilNuevo;

        loenFormularioObjetoPerfil = ornFormularioObjetoPerfil.Listar(int.Parse(ddlPerfil.SelectedValue));
        Session["ObjetosBD"] = loenFormularioObjetoPerfil;

        if (loenMenuPerfilNuevo.Count != 0)
            ObtenerPadres();
    }

    protected void btnCancelar_Click(object sender, EventArgs e)
    {
        LimpiarPadre();
    }

    protected void btnSi_Click1(object sender, EventArgs e)
    {
        RecorrerTreeViewPadres(trvMenu.Nodes);
        StringBuilder sb = new StringBuilder();
        sb.Append(@"<script language='javascript'>");
        sb.Append(@"var lbl =  AbrirModal('330', '210', true, false, '#confirmacion', true);");
        sb.Append(@"$('#confirmacion').css('display', 'block');");
        sb.Append(@"</script>");
        ClientScript.RegisterStartupScript(this.GetType(), "JSScript", sb.ToString());
    }

    #endregion
}